#include <bits/stdc++.h>
using namespace std;

// 全局变量：存储最终答案
long long ans;
int n, m;  // n: 数组A的大小，m: 查询参数

/**
 * 递归解决函数：使用分治和位运算处理问题
 * @param Q 查询向量，每个元素是(r, v)对，r表示范围，v表示权重
 * @param A 输入数组
 * @param k 当前处理的位（从高位到低位）
 */
void solve(vector<pair<int, int>> Q, vector<int> A, int k) {
  // 递归终止条件：处理完所有位
  if (k == -1)
    return;
    
  // 根据第k位将数组A分成两部分
  vector<int> L, R;  // L: 第k位为0的元素，R: 第k位为1的元素
  vector<pair<int, int>> QL, QR;  // 对应的查询子问题
  
  // 将数组A按第k位分成L和R两部分
  for (auto a : A)
    if (a & (1 << k))  // 检查第k位是否为1
      R.push_back(a);
    else
      L.push_back(a);

  // 对查询进行排序，便于处理相同r值的查询
  sort(Q.begin(), Q.end());

  // 处理每个查询
  for (int i = 0, l = Q.size(); i < l; ++i) {
    int r = Q[i].first;   // 查询范围
    int v = Q[i].second;  // 查询权重
    
    // 合并相同r值的查询（权重相加）
    while (i + 1 < l && Q[i + 1].first == r) {
      v += Q[i + 1].second;
      ++i;
    }

    // 情况1：r <= 2^k（查询范围在当前位表示的最大值内）
    if (r <= (1 << k)) {
      if (!L.empty()) {
        // 如果L非空，将查询加入左子问题
        QL.push_back(make_pair(r, v));
      } else {
        // 如果L为空，直接计算贡献并加入右子问题
        ans += 1ll * (1 << k) * v * r;
        QR.push_back(make_pair(r, v));
      }
    }
    // 情况2：r > 2^k（查询范围跨越当前位）
    else {
      // 处理前半部分 [0, 2^k)
      if (L.empty()) {
        // 如果L为空，直接计算前半部分的贡献
        ans += 1ll * (1 << k) * v * (1 << k);
        QR.push_back(make_pair((1 << k), v));
      } else {
        // 如果L非空，将前半部分查询加入左子问题
        QL.push_back(make_pair((1 << k), v));
      }

      // 处理后半部分 [2^k, r)
      if (R.empty()) {
        // 如果R为空，直接计算后半部分的贡献
        ans += 1ll * (1 << k) * v * (r - (1 << k));
        QL.push_back(make_pair(r - (1 << k), v));
      } else {
        // 如果R非空，将后半部分查询加入右子问题
        QR.push_back(make_pair(r - (1 << k), v));
      }
    }
  }
  
  // 递归处理左子问题（如果存在）
  if (!QL.empty() && !L.empty())
    solve(QL, L, k - 1);

  // 递归处理右子问题（如果存在）
  if (!QR.empty() && !R.empty())
    solve(QR, R, k - 1);
}

int main() {
  // 读取输入
  cin >> n >> m;
  vector<int> A;  // 存储输入数组
  vector<pair<int, int>> Q;  // 存储查询
  
  // 读取数组A
  for (int i = 1; i <= n; ++i) {
    int a;
    cin >> a;
    A.push_back(a);
  }
  
  // 初始化查询：范围为m，权重为1
  Q.push_back(make_pair(m, 1));

  // 从最高位（第30位）开始递归求解
  solve(Q, A, 30);
  
  // 输出最终答案
  cout << ans << endl;
  return 0;
}